package com.example.demo.demo.string;

import java.io.UnsupportedEncodingException;

/**
 * 测试字符串 占多少字节
 *
 * Java采用unicode来表示字符，java中的一个char是2个字节，一个中文或英文字符的unicode编码都占2个字节，
 *
 * 而采用 getBytes().length 后变成3字节。是因为 String.getBytes()是一个用于将String的内码转换为指定的外码的方法。无参数版使用平台的默认编码作为外码，
 * 有参数版使用参数指定的编码作为外码；将String的内容用外码编码好，结果放在一个新byte[]返回。
 *
 * 但如果采用其他编码方式，一个字符占用的字节数则各不相同。
 * 在GBK 编码中，一个英文字母字符存储需要1个字节，一个汉子字符存储需要2个字节。
 * 在UTF-8编码中，一个英文字母字符存储需要1个字节，一个汉字字符储存需要3到4个字节。
 * 综上所述，那要看汉字是以什么编码格式来存储了，以及汉字是否为特殊汉字。

 *链接：https://www.zhihu.com/question/27562173/answer/1293856493
 *
 * https://www.zhihu.com/question/27562173
 *
 * @author luowenjie
 * @since 2021/9/14 17:29
 */
public class StringSizeTest {

    public static void main(String[] args){
        String  a="中国";
        //缺省是UTF-8编码 1个中文占3个字节
        System.out.println("字符"+a+"--缺省编码UTF-8:"+a.getBytes().length);
        //设置为GBK编码  1个中文占2个字节
        try {
            System.out.println("字符"+a+"--"+"设置编码GBK:"+a.getBytes("GBK").length);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        String  b="12";
        //缺省是UTF-8编码 1个中文占3个字节
        System.out.println("字符"+b+"--缺省编码UTF-8:"+b.getBytes().length);
        //设置为GBK编码  1个中文占2个字节
        try {
            System.out.println("字符"+b+"--"+"设置编码GBK:"+b.getBytes("GBK").length);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        String  c="o-G_Ut95oh7XsE4qQSbqvrHxmYto";
        //缺省是UTF-8编码 1个中文占3个字节
        System.out.println("字符"+c+"--缺省编码UTF-8:"+c.getBytes().length);
        //设置为GBK编码  1个中文占2个字节
        try {
            System.out.println("字符"+c+"--"+"设置编码GBK:"+c.getBytes("GBK").length);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        //char b ='中';
        //System.out.println(b);
    }

}
